IOC
控制反转(Inversion of Control)是一种是面向对象编程中的一种设计原则,用来减低计算机代码之间的耦合度,实现对象之间的“解耦”。
基本思想是:借助于 “第三方” 实现具有依赖关系的对象之间的解耦。相当于实例都是外部的一个 container 去接管。当一个类的实例依赖另一个类的实例时,自己不创建该实例,由 IOC 容器创建并注入给自己,因此称为依赖注入。依赖注入解决的就是如何有效组织代码依赖模块的问题。
DI
为什么要用依赖注入?
它允许把应用程序所需的依赖关系从代码中分离出来。这有助于提高代码的可测试性、可维护性和可扩展性。依赖注入的好处在于,它可以使得代码更具模块化,可以使用不同的实现来替换已有的实现,而不会影响到整个应用程序。
并且由于依赖注入将模块解耦开,使得模块很容易被替换,这能应用的跨平台性做的比较好。
DI 的好处
- 跨平台支持很好,不同平台的 Service 有各自实现,可以通过 DI 的方式注入。
- 使用比较友好,虽然也需要 import 但是基本上不需要关注 Service 实例的维护。
- 对于集成测试,可以很方便的 mock 掉依赖的模块。
InversifyJS
由于 InversifyJS 用到了反射来获取装饰器的相关元数据,所以需要额外安装库 reflect-metadata. 另外,InversifyJS 要求 Typescript >= 2.0 并且需要配置如下编译参数:
{
"compilerOptions": {
"target": "es5",
"lib": ["es6", "dom"],
"types": ["reflect-metadata"],
"module": "commonjs",
"moduleResolution": "node",
"experimentalDecorators": true,
"emitDecoratorMetadata": true
}
}
https://zhuanlan.zhihu.com/p/137542149 https://doc.inversify.cloud/zh_cn/
Injectable 和 Inject
http://www.voidcn.com/article/p-xvbfjeph-buk.html
Injectable
@Injectable()让 Angular 2 知道一个类可以用于依赖注入器。 如果类上有其他 Angular 2 装饰器或没有任何依赖,@Injectable()不是必须的。
@Injectable 装饰器旨在实际设置一些关于要注入相关类的构造函数的依赖项的元数据.它是一个不需要参数的类装饰器.没有这个装饰器就不会注入依赖…
Inject
@Inject()是一个手动机制,让 Angular 2 知道必须注入参数。
必须在构造函数参数级别使用@Inject 修饰符来指定有关要注入的元素的元数据.没有它,使用参数类型(obj:SomeType 相当于@Inject(SomeType)obj).
VS Code 的依赖注入
- 创建、获取。
- context 会有父子 Scoped 的概念。
其他
https://www.cnblogs.com/front-end-ralph/p/5208045.html